#include <stdlib.h>
#include "my_thread.h"
#include "my_thread_queue.h"

#define handle_error(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)

	
typedef struct thread * thread_t;
thread_t current;
//thread_t th;

//void** retval;

/*void* fct(void* param){
		return param;
}
*/

// la fct lancement crée un threa et le lance puis atend sa terminaison et s'assure que la libération des ressources se fait correctement. 
void lancement(thread_t th, void* (*fct)(void *), void param){
	int a = thread_create(th, fct, param);
	ucontext_t uc = (*th)->context; 
	assert(uc.uc_stack.ss_sp != NULL);
	if (a == -1) handle_error("thread_create");
	else {
		thread_join(th, retval); // J'attend que le thread th termine
		assert (uc.uc_stack.ss_sp == NULL);
		printf("thread exited");					
		}
	
}

// la fct chgt_contexte_thread_unique s'assure que le changement de contexte se fait correctement dans le cas où un seul thread s'exécute. 
void chgt_contexte_thread_unique(){
	
	tmp = current->context;
	printf("je suis le thread %p, et voici mon contexte %p", thread_self(), current->context);
	if (current->next == NULL){
		thread_yield();
		assert(tmp == current->context);
	}
}

void ordonnacement_multi_thread(){
	thread_queue q = create_queue();
	thread_t i = malloc(sizeof(struct thread));
	thread_t j = malloc(sizeof(struct thread));
	thread_t k = malloc(sizeof(struct thread));
	insert(i,q);
	insert(j,q);
	insert(k,q);
	// pas encore finie



}

 
